{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Building a Convolutional Neural Network (CNN) for emotion recognition with TensorFlow Eager \n",
    "----\n",
    "\n",
    "One of my favourite parts about deep learning is that I can work on problems where I can test the neural networks on myself. The most entertaining neural network that I've built so far is a CNN for emotion recognition. I've managed to pass my webcam video through the network and got predictions of my emotions ~real-time (using a GTX-1070). Quite addictive hehe :)!\n",
    "\n",
    "Thus, if you would like to combine work with fun, you should definitely go through this tutorial.\n",
    "Plus, it is a great way to get familiar with the Eager API :)!\n",
    "\n",
    "\n",
    "### Tutorial steps\n",
    "----\n",
    "![img](tutorials_graphics/03_flowchart.png)\n",
    "\n",
    "* _Download and process the FER2013 dataset available on Kaggle._\n",
    "* _Exploratory data analysis on the entire dataset._\n",
    "* _Split the dataset into a train and dev dataset._\n",
    "* _Normalize images._\n",
    "* _Using the tf.data.Dataset API to iterate through train and dev dataset._\n",
    "* _Creating a class for a CNN in Eager mode._\n",
    "    * _Ability to save the model or restore from a previous checkpoint._\n",
    "* _Create a loss function, an optimizer and a function to compute gradients._\n",
    "* _Train the model with gradient descent._\n",
    "    * _Whether from scratch or start with a pre-trained model._\n",
    "* _Visualize the performance during training and compute the accuracy._\n",
    "* _Visualize the CNN attribution on sample images using Integrated Gradients._\n",
    "* _Testing the CNN on new images using OpenCV and the Haar Cascades algorithm._\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import useful libraries\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import libraries for data visualization and processing\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# Import TensorFlow and TensorFlow Eager\n",
    "import tensorflow as tf\n",
    "import tensorflow.contrib.eager as tfe\n",
    "\n",
    "# Make the plots appear inline in the notebook\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Enable eager mode. Once activated it cannot be reversed! Run just once.\n",
    "tfe.enable_eager_execution()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Download dataset \n",
    "----\n",
    "To train our CNN, we will use the FER2013 dataset, available on Kaggle. You have to download the dataset yourself, on their platform, as unfortunately I cannot share the data publicly. Nevertheless, the dataset has only 96.4 MB so you should be able to download it in no time. You can download it [here](https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data).\n",
    "\n",
    "Once you have downloaded the data, unzip it and place it into a folder called 'datasets', so you do not have to make any modifications on the code below.\n",
    "\n",
    "Okay, so let's get started with the exploratory data analysis :)!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Exploratory data analysis\n",
    "----\n",
    "Before building any machine learning model, it is recommended to do an exploratory data analysis on your dataset. This gives you the opportunity to find any weaknesses in the dataset like strong imbalance between classes, low quality images etc. \n",
    "\n",
    "I find that most of the bugs that occur in a machine learning project are due to incorrect data processing. It will be much harder to find these errors if you start investigating the dataset only after you find that your model is not working. \n",
    "\n",
    "So, my advice to you is: always analyse the data before building any model :)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Read input data. Assuming you've unzipped the dataset and put it into a folder named 'data'\n",
    "path_data = 'datasets/fer2013/fer2013.csv'\n",
    "data = pd.read_csv(path_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of samples in the dataset:  35887\n"
     ]
    }
   ],
   "source": [
    "print('Number of samples in the dataset: ', data.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>emotion</th>\n",
       "      <th>pixels</th>\n",
       "      <th>Usage</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>70 80 82 72 58 58 60 63 54 58 60 48 89 115 121...</td>\n",
       "      <td>Training</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>151 150 147 155 148 133 111 140 170 174 182 15...</td>\n",
       "      <td>Training</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>231 212 156 164 174 138 161 173 182 200 106 38...</td>\n",
       "      <td>Training</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>24 32 36 30 32 23 19 20 30 41 21 22 32 34 21 1...</td>\n",
       "      <td>Training</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>4 0 0 0 0 0 0 0 0 0 0 0 3 15 23 28 48 50 58 84...</td>\n",
       "      <td>Training</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   emotion                                             pixels     Usage\n",
       "0        0  70 80 82 72 58 58 60 63 54 58 60 48 89 115 121...  Training\n",
       "1        0  151 150 147 155 148 133 111 140 170 174 182 15...  Training\n",
       "2        2  231 212 156 164 174 138 161 173 182 200 106 38...  Training\n",
       "3        4  24 32 36 30 32 23 19 20 30 41 21 22 32 34 21 1...  Training\n",
       "4        6  4 0 0 0 0 0 0 0 0 0 0 0 3 15 23 28 48 50 58 84...  Training"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# See first 5 rows\n",
    "data.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>emotion</th>\n",
       "      <th>number_samples</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Happy</td>\n",
       "      <td>8989</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Neutral</td>\n",
       "      <td>6198</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Sad</td>\n",
       "      <td>6077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Fear</td>\n",
       "      <td>5121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Angry</td>\n",
       "      <td>4953</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Surprise</td>\n",
       "      <td>4002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Disgust</td>\n",
       "      <td>547</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    emotion  number_samples\n",
       "0     Happy            8989\n",
       "1   Neutral            6198\n",
       "2       Sad            6077\n",
       "3      Fear            5121\n",
       "4     Angry            4953\n",
       "5  Surprise            4002\n",
       "6   Disgust             547"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Get the meaning of each emotion index\n",
    "emotion_cat = {0:'Angry', 1:'Disgust', 2:'Fear', 3:'Happy', 4:'Sad', 5:'Surprise', 6:'Neutral'}\n",
    "\n",
    "# See the target distribution (check for imbalance)\n",
    "target_counts = data['emotion'].value_counts().reset_index(drop=False)\n",
    "target_counts.columns = ['emotion', 'number_samples']\n",
    "target_counts['emotion'] = target_counts['emotion'].map(emotion_cat)\n",
    "target_counts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, the dataset is quite imbalanced. Especially for the emotion 'Disgust'. This will make the training harder for this class, as the network will have less oportunities to learn the representation of this type of emotion. \n",
    "\n",
    "We will see if this will severely impact the training of our network, a bit later, after we've trained our network.\n",
    "\n",
    "Let's see some images!\n",
    "\n",
    "The images are currenty represented as a string of integers, each integer representing the intensity of one pixel. We will process the string to be represented as a list of integers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Transform images from strings to lists of integers\n",
    "data['pixels'] = data['pixels'].apply(lambda x: [int(pixel) for pixel in x.split()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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JYzNKTBfYnME4zLC2JwsxuYUMDanhbE5OeZLbI6U3xub08LYnBzG5hQwNqfFvIzN2fwS6JaIOLGrlP2qiHhfRHx9Fp8/DF+PiEu7/740OrmRs04ppUTEpyJiTa31D3sOjUT5IiJKKUeUUg7u/nu/iPgfoiOKdU1E/Hz3tDkpY631slrr0lrr8uj429W11l8chbKNGMbmkIx6bI5yXEYYm0NgbA6JsTk9jM1JM19icyT8PsLYnC7G5qQxNofE2Jwe8zY296bgEP+LiEsi4v7o5PH9H7P57AFl+kJEbI2IF6Kze/zB6OTxXRUR67r/P3SOyvam6Hw6dmdErO7+d8molK9bxjMj4vZuGe+OiH/R/fnxEXFzRDwQEV+KiB+b437+8Yi4fBTLNgr/GZtDl22kY3O+xGW3TMbm4PYxNocrm7E5c2U1Nge3z0jF5ijHZbd8xubMldXYHNw+xuZw5TM2Z66s8yY2S7eQIiIiIiIiIiLyCmY208FERERERERERGSOcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIRERERERERGQMcBNIXqaU8tlSyr+Z63KIyNQppVxbSvlHc10OEREREZGXKKUcU0r5QSlln7kuy7jjJtArgFLKm0opN5RSdpZSniil/PdSynlzXS6RVyKllAdLKdtLKa/t+dk/KqVcOwP3rqWUFdO9j4j8Ld2N0SdLKT8212URkf5059bnuy+IL/23eK7LJfJKYy7fG2utD9da96+1vjgbz5M94ybQPKeUcmBEXB4R/zEiDo2IJRHxryLiR3NZLpFXOAsj4jdm+6GllIWz/UyR+UwpZXlEXBwRNSJ+Zi89w7gRzrBJAAAgAElEQVQUmRn+bvcF8aX/tszUjY1TkZl7bywdhtpHMAZHCzeB5j8nRUTUWr9Qa32x1vp8rfXbtdY7SyknlFKuLqU8Xkp5rJTy56WUg1+6sJRydinltlLKM6WUL0bEq+esFiLzi38fEf+kN55eopRySinlyu5vV+4rpby351iTqlVK+eVSyve6//5u98d3dH8D+vdKKT9eStlcSvntUsq2iPhMKeWQUsrlpZRHu183XF5KWbqX6ysyX/n7EXFjRHw2Ii596Yfd9Of/VEr5RncOvKmUckLP8b/Tjd+dpZSPl1Kueyl2u3H730spHy2lPBERv9ON9zN6rj+y+1XDEbNWU5FXIKWUC7pfLTxVSrmjlPLjPcf+QSllTTeGN5RS/nHPsQnz51yUX2TEGPTe+JFSyudfOrGUsrz7hfrCrn1tKeV3Syn/PSKei4jjuz/7t6WUm7vz5ddK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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fd722a092b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Change seed here to see other images\n",
    "random_seed = 2\n",
    "\n",
    "# Select randomly 10 images\n",
    "data_sample = data.sample(10, random_state=random_seed)\n",
    "\n",
    "# Create subplots for images\n",
    "f, axarr = plt.subplots(2, 5, figsize=(20, 10))\n",
    "\n",
    "# Plot images\n",
    "i, j = 0, 0\n",
    "for idx, row in data_sample.iterrows():\n",
    "    img = np.array(row['pixels']).reshape(48,48)\n",
    "    axarr[i,j].imshow(img, cmap='gray')\n",
    "    axarr[i,j].set_title(emotion_cat[row['emotion']])\n",
    "    if j==4:\n",
    "        i += 1\n",
    "        j = 0\n",
    "    else:\n",
    "        j += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Split  dataset in train/dev datasets and normalize images by max\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number samples in the training dataset:  28709\n",
      "Number samples in the development dataset:  7178\n"
     ]
    }
   ],
   "source": [
    "data_train = data[data['Usage']=='Training']\n",
    "size_train = data_train.shape[0]\n",
    "print('Number samples in the training dataset: ', size_train)\n",
    "\n",
    "data_dev = data[data['Usage']!='Training']\n",
    "size_dev = data_dev.shape[0]\n",
    "print('Number samples in the development dataset: ', size_dev)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Retrieve train input and target\n",
    "X_train, y_train = data_train['pixels'].tolist(), data_train['emotion'].as_matrix()\n",
    "# Reshape images to 4D (num_samples, width, height, num_channels)\n",
    "X_train = np.array(X_train, dtype='float32').reshape(-1,48,48,1)\n",
    "# Normalize images with max (the maximum pixel intensity is 255)\n",
    "X_train = X_train/255.0\n",
    "\n",
    "# Retrieve dev input and target\n",
    "X_dev, y_dev = data_dev['pixels'].tolist(), data_dev['emotion'].as_matrix()\n",
    "# Reshape images to 4D (num_samples, width, height, num_channels)\n",
    "X_dev = np.array(X_dev, dtype='float32').reshape(-1,48,48,1)\n",
    "# Normalize images with max\n",
    "X_dev = X_dev/255.0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using the tf.data.Dataset API\n",
    "----\n",
    "\n",
    "To prepare our dataset to be used as an input to the CNN, we will use the tf.data.Dataset API which will convert the numpy arrays we've just created, to TF tensors. As this dataset is much bigger than the datasets in the previous tutorials, we will actually have to feed the data to the model in batches.\n",
    "\n",
    "Normally, for computational efficiency, you would choose a batch as big as you can fit into memory. However, in my experience, I obtain better results on test data, if I use smaller batches during training. Feel free to play with the batch size and see if you get to the same conclusion as I did."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Feel free to modify the size of the batches\n",
    "# Usually smaller batch sizes obtain better results on test data\n",
    "batch_size = 64\n",
    "training_data = tf.data.Dataset.from_tensor_slices((X_train, y_train[:,None])).batch(batch_size)\n",
    "eval_data = tf.data.Dataset.from_tensor_slices((X_dev, y_dev[:,None])).batch(batch_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create CNN model in Eager mode\n",
    "----\n",
    "\n",
    "The CNN architecture is created in the cell below. As you can see, the class _EmotionRecognitionCNN_ inherits from _tf.keras.Model_ class as we want to track the layers that contain any trainable parameters (e.g. the weights of a convolution, the mean of a batch normalization layer). This makes it extremely easy to save these variables and then restore them at a later time when we want to continue training the network. \n",
    "\n",
    "The original architecture of this CNN can be found [here](https://github.com/oarriaga/face_classification) (built with keras). I thought that it will be really useful if you start with a simpler architecture than ResNet for example. This network turns out to work pretty well for its size. \n",
    "\n",
    "You can play with it, add more layers, increase the number of layers, filters etc. See if you can obtain better results.\n",
    "\n",
    "One thing that is sure, is that the network works better with higher dropout."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "class EmotionRecognitionCNN(tf.keras.Model):\n",
    "    \n",
    "    def __init__(self, num_classes, device='cpu:0', checkpoint_directory=None):\n",
    "        ''' Define the parameterized layers used during forward-pass, the device\n",
    "            where you would like to run the computation on and the checkpoint\n",
    "            directory.\n",
    "            \n",
    "            Args:\n",
    "                num_classes: the number of labels in the network.\n",
    "                device: string, 'cpu:n' or 'gpu:n' (n can vary). Default, 'cpu:0'.\n",
    "                checkpoint_directory: the directory where you would like to save or \n",
    "                                      restore a model.\n",
    "        ''' \n",
    "        super(EmotionRecognitionCNN, self).__init__()\n",
    "        \n",
    "        # Initialize layers\n",
    "        self.conv1 = tf.layers.Conv2D(16, 5, padding='same', activation=None)\n",
    "        self.batch1 = tf.layers.BatchNormalization()\n",
    "        self.conv2 = tf.layers.Conv2D(16, 5, 2, padding='same', activation=None)\n",
    "        self.batch2 = tf.layers.BatchNormalization()\n",
    "        self.conv3 = tf.layers.Conv2D(32, 5, padding='same', activation=None)\n",
    "        self.batch3 = tf.layers.BatchNormalization()\n",
    "        self.conv4 = tf.layers.Conv2D(32, 5, 2, padding='same', activation=None)\n",
    "        self.batch4 = tf.layers.BatchNormalization()\n",
    "        self.conv5 = tf.layers.Conv2D(64, 3, padding='same', activation=None)\n",
    "        self.batch5 = tf.layers.BatchNormalization()\n",
    "        self.conv6 = tf.layers.Conv2D(64, 3, 2, padding='same', activation=None)\n",
    "        self.batch6 = tf.layers.BatchNormalization()\n",
    "        self.conv7 = tf.layers.Conv2D(64, 1, padding='same', activation=None)\n",
    "        self.batch7 = tf.layers.BatchNormalization()\n",
    "        self.conv8 = tf.layers.Conv2D(128, 3, 2, padding='same', activation=None)\n",
    "        self.batch8 = tf.keras.layers.BatchNormalization()\n",
    "        self.conv9 = tf.layers.Conv2D(256, 1, padding='same', activation=None)\n",
    "        self.batch9 = tf.keras.layers.BatchNormalization()\n",
    "        self.conv10 = tf.layers.Conv2D(128, 3, 2, padding='same', activation=None)\n",
    "        self.conv11 = tf.layers.Conv2D(256, 1, padding='same', activation=None)\n",
    "        self.batch11 = tf.layers.BatchNormalization()\n",
    "        self.conv12 = tf.layers.Conv2D(num_classes, 3, 2, padding='same', activation=None)\n",
    "        \n",
    "        # Define the device \n",
    "        self.device = device\n",
    "        \n",
    "        # Define the checkpoint directory\n",
    "        self.checkpoint_directory = checkpoint_directory\n",
    "       \n",
    "    def predict(self, images, training):\n",
    "        \"\"\" Predicts the probability of each class, based on the input sample.\n",
    "            \n",
    "            Args:\n",
    "                images: 4D tensor. Either an image or a batch of images.\n",
    "                training: Boolean. Either the network is predicting in\n",
    "                          training mode or not.\n",
    "        \"\"\"\n",
    "        x = self.conv1(images)\n",
    "        x = self.batch1(x, training=training)\n",
    "        x = self.conv2(x)\n",
    "        x = self.batch2(x, training=training)\n",
    "        x = tf.nn.relu(x)\n",
    "        x = tf.layers.dropout(x, rate=0.4, training=training)\n",
    "        x = self.conv3(x)\n",
    "        x = self.batch3(x, training=training)\n",
    "        x = self.conv4(x)\n",
    "        x = self.batch4(x, training=training)\n",
    "        x = tf.nn.relu(x)\n",
    "        x = tf.layers.dropout(x, rate=0.3, training=training)\n",
    "        x = self.conv5(x)\n",
    "        x = self.batch5(x, training=training)\n",
    "        x = self.conv6(x)\n",
    "        x = self.batch6(x, training=training)\n",
    "        x = tf.nn.relu(x)\n",
    "        x = tf.layers.dropout(x, rate=0.3, training=training)\n",
    "        x = self.conv7(x)\n",
    "        x = self.batch7(x, training=training)\n",
    "        x = self.conv8(x)\n",
    "        x = self.batch8(x, training=training)\n",
    "        x = tf.nn.relu(x)\n",
    "        x = tf.layers.dropout(x, rate=0.3, training=training)\n",
    "        x = self.conv9(x)\n",
    "        x = self.batch9(x, training=training)\n",
    "        x = self.conv10(x)\n",
    "        x = self.conv11(x)\n",
    "        x = self.batch11(x, training=training)\n",
    "        x = self.conv12(x)\n",
    "        return tf.layers.flatten(x)\n",
    "    \n",
    "    def loss_fn(self, images, target, training):\n",
    "        \"\"\" Defines the loss function used during \n",
    "            training.         \n",
    "        \"\"\"\n",
    "        preds = self.predict(images, training)\n",
    "        loss = tf.losses.sparse_softmax_cross_entropy(labels=target, logits=preds)\n",
    "        return loss\n",
    "    \n",
    "    def grads_fn(self, images, target, training):\n",
    "        \"\"\" Dynamically computes the gradients of the loss value\n",
    "            with respect to the parameters of the model, in each\n",
    "            forward pass.\n",
    "        \"\"\"\n",
    "        with tfe.GradientTape() as tape:\n",
    "            loss = self.loss_fn(images, target, training)\n",
    "        return tape.gradient(loss, self.variables)\n",
    "    \n",
    "    def restore_model(self):\n",
    "        \"\"\" Function to restore trained model.\n",
    "        \"\"\"\n",
    "        with tf.device(self.device):\n",
    "            # Run the model once to initialize variables\n",
    "            dummy_input = tf.constant(tf.zeros((1,48,48,1)))\n",
    "            dummy_pred = self.predict(dummy_input, training=False)\n",
    "            # Restore the variables of the model\n",
    "            saver = tfe.Saver(self.variables)\n",
    "            saver.restore(tf.train.latest_checkpoint\n",
    "                          (self.checkpoint_directory))\n",
    "    \n",
    "    def save_model(self, global_step=0):\n",
    "        \"\"\" Function to save trained model.\n",
    "        \"\"\"\n",
    "        tfe.Saver(self.variables).save(self.checkpoint_directory, \n",
    "                                       global_step=global_step)   \n",
    "    \n",
    "    def compute_accuracy(self, input_data):\n",
    "        \"\"\" Compute the accuracy on the input data.\n",
    "        \"\"\"\n",
    "        with tf.device(self.device):\n",
    "            acc = tfe.metrics.Accuracy()\n",
    "            for images, targets in tfe.Iterator(input_data):\n",
    "                # Predict the probability of each class\n",
    "                logits = self.predict(images, training=False)\n",
    "                # Select the class with the highest probability\n",
    "                preds = tf.argmax(logits, axis=1)\n",
    "                # Compute the accuracy\n",
    "                acc(tf.reshape(targets, [-1,]), preds)\n",
    "        return acc\n",
    "        \n",
    "    def fit(self, training_data, eval_data, optimizer, num_epochs=500, \n",
    "            early_stopping_rounds=10, verbose=10, train_from_scratch=False):\n",
    "        \"\"\" Function to train the model, using the selected optimizer and\n",
    "            for the desired number of epochs. You can either train from scratch\n",
    "            or load the latest model trained. Early stopping is used in order to\n",
    "            mitigate the risk of overfitting the network.\n",
    "            \n",
    "            Args:\n",
    "                training_data: the data you would like to train the model on.\n",
    "                                Must be in the tf.data.Dataset format.\n",
    "                eval_data: the data you would like to evaluate the model on.\n",
    "                            Must be in the tf.data.Dataset format.\n",
    "                optimizer: the optimizer used during training.\n",
    "                num_epochs: the maximum number of iterations you would like to \n",
    "                            train the model.\n",
    "                early_stopping_rounds: stop training if the loss on the eval \n",
    "                                       dataset does not decrease after n epochs.\n",
    "                verbose: int. Specify how often to print the loss value of the network.\n",
    "                train_from_scratch: boolean. Whether to initialize variables of the\n",
    "                                    the last trained model or initialize them\n",
    "                                    randomly.\n",
    "        \"\"\" \n",
    "    \n",
    "        if train_from_scratch==False:\n",
    "            self.restore_model()\n",
    "        \n",
    "        # Initialize best loss. This variable will store the lowest loss on the\n",
    "        # eval dataset.\n",
    "        best_loss = 999\n",
    "        \n",
    "        # Initialize classes to update the mean loss of train and eval\n",
    "        train_loss = tfe.metrics.Mean('train_loss')\n",
    "        eval_loss = tfe.metrics.Mean('eval_loss')\n",
    "        \n",
    "        # Initialize dictionary to store the loss history\n",
    "        self.history = {}\n",
    "        self.history['train_loss'] = []\n",
    "        self.history['eval_loss'] = []\n",
    "        \n",
    "        # Begin training\n",
    "        with tf.device(self.device):\n",
    "            for i in range(num_epochs):\n",
    "                # Training with gradient descent\n",
    "                for images, target in tfe.Iterator(training_data):\n",
    "                    grads = self.grads_fn(images, target, True)\n",
    "                    optimizer.apply_gradients(zip(grads, self.variables))\n",
    "                    \n",
    "                # Compute the loss on the training data after one epoch\n",
    "                for images, target in tfe.Iterator(training_data):\n",
    "                    loss = self.loss_fn(images, target, False)\n",
    "                    train_loss(loss)\n",
    "                self.history['train_loss'].append(train_loss.result().numpy())\n",
    "                # Reset metrics\n",
    "                train_loss.init_variables()\n",
    "                \n",
    "                # Compute the loss on the eval data after one epoch\n",
    "                for images, target in tfe.Iterator(eval_data):\n",
    "                    loss = self.loss_fn(images, target, False)\n",
    "                    eval_loss(loss)\n",
    "                self.history['eval_loss'].append(eval_loss.result().numpy())\n",
    "                # Reset metrics\n",
    "                eval_loss.init_variables()\n",
    "                \n",
    "                # Print train and eval losses\n",
    "                if (i==0) | ((i+1)%verbose==0):\n",
    "                    print('Train loss at epoch %d: ' %(i+1), self.history['train_loss'][-1])\n",
    "                    print('Eval loss at epoch %d: ' %(i+1), self.history['eval_loss'][-1])\n",
    "\n",
    "                # Check for early stopping\n",
    "                if self.history['eval_loss'][-1]<best_loss:\n",
    "                    best_loss = self.history['eval_loss'][-1]\n",
    "                    count = early_stopping_rounds\n",
    "                else:\n",
    "                    count -= 1\n",
    "                if count==0:\n",
    "                    break  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the model with gradient descent and early stopping\n",
    "----\n",
    "\n",
    "I have saved the weights after training the network for 35 epochs. You can restore and fine tune them for a few more epochs. If you do not have a GPU on your computer, it will be much easier to further tune the model, than starting training the model from scratch.\n",
    "\n",
    "You can use early stopping to stop training the network, if the loss on the dev dataset does not decrease after _n_ epochs (you can set the number of *n* with the variable *early_stopping_rounds*)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Specify the path where you want to save/restore the trained variables.\n",
    "checkpoint_directory = 'models_checkpoints/EmotionCNN/'\n",
    "\n",
    "# Use the GPU if available.\n",
    "device = 'gpu:0' if tfe.num_gpus()>0 else 'cpu:0'\n",
    "\n",
    "# Define optimizer.\n",
    "optimizer = tf.train.AdamOptimizer()\n",
    "\n",
    "# Instantiate model. This doesn't initialize the variables yet.\n",
    "model = EmotionRecognitionCNN(num_classes=7, device=device, \n",
    "                              checkpoint_directory=checkpoint_directory)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train loss at epoch 1:  1.5994938561539342\n",
      "Eval loss at epoch 1:  1.6061641948413006\n",
      "Train loss at epoch 10:  1.1655063030448947\n",
      "Eval loss at epoch 10:  1.2517835698296538\n",
      "Train loss at epoch 20:  1.007327914901725\n",
      "Eval loss at epoch 20:  1.1543473274306912\n",
      "Train loss at epoch 30:  0.9942544895184863\n",
      "Eval loss at epoch 30:  1.1808805191411382\n"
     ]
    }
   ],
   "source": [
    "# Train model\n",
    "model.fit(training_data, eval_data, optimizer, num_epochs=500, \n",
    "          early_stopping_rounds=5, verbose=10, train_from_scratch=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Save trained model\n",
    "model.save_model()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize the performance during training\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f335e8d14a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(len(model.history['train_loss'])), model.history['train_loss'],\n",
    "         color='b', label='Train loss');\n",
    "plt.plot(range(len(model.history['eval_loss'])), model.history['eval_loss'], \n",
    "         color='r', label='Dev loss');\n",
    "plt.title('Model performance during training', fontsize=15)\n",
    "plt.xlabel('Number of epochs', fontsize=15);\n",
    "plt.ylabel('Loss', fontsize=15);\n",
    "plt.legend(fontsize=15);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Compute accuracy\n",
    "----"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_acc = model.compute_accuracy(training_data)\n",
    "eval_acc = model.compute_accuracy(eval_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train accuracy:  0.6615347103695706\n",
      "Eval accuracy:  0.5728615213151296\n"
     ]
    }
   ],
   "source": [
    "print('Train accuracy: ', train_acc.result().numpy())\n",
    "print('Eval accuracy: ', eval_acc.result().numpy())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize neural network attributions with integrated gradients\n",
    "----\n",
    "\n",
    "So now that we have trained our CNN model, let's see if we can understand its reasoning using integrated gradients. This methodology is thoroughly explained in [this paper](https://arxiv.org/abs/1703.01365), called Axiomatic Attribution for Deep Networks.\n",
    "\n",
    "Normally, the first attempt you would do to understand the predictions of your model is to compute directly the derivative of the output class with respect to the image. This can give you a hint on which part of the image activated the network. However, this technique is sensitive to image artifacts.\n",
    "\n",
    "To avoid this pitfall we are going to use integrated gradients to compute the attributions of the network for a certain image. This technique simply takes the original image, scales the pixel intensities to various degrees (from $\\frac{1}{m}$ to m, where m is the number of steps) and computes the gradient with respect to each scaled image. To obtain the attributions, the gradients of all the scaled images are averaged and multiplied with the original image.\n",
    "\n",
    "Here is an example of how you would implement this with TensorFlow Eager:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_prob_class(X, idx_class):\n",
    "    \"\"\" Gets the softmax probability of the selected class.\n",
    "        \n",
    "        Args:\n",
    "            X: 4D tensor image.\n",
    "            \n",
    "        Returns:\n",
    "            prob_class: the probability of the selected class.  \n",
    "    \"\"\"\n",
    "    logits = model.predict(X, False)\n",
    "    prob_class = logits[0, idx_class]\n",
    "    return prob_class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def integrated_gradients(X, m=200):\n",
    "    \"\"\" Computes the integrated gradients for an image sample.\n",
    "        \n",
    "        Args:\n",
    "            X: 4D tensor of the image sample.\n",
    "            m: number of steps, more steps leads to a better approximation.\n",
    "               \n",
    "        Returns:\n",
    "            g: integrated gradients.\n",
    "    \"\"\"\n",
    "    perc = (np.arange(1,m+1)/m).reshape(m,1,1,1)\n",
    "    perc = tf.constant(perc, dtype=tf.float32)\n",
    "    idx_class = tf.argmax(model.predict(X, False), axis=1).numpy()[0]\n",
    "    X_tiled = tf.tile(X, [m,1,1,1])\n",
    "    X_scaled = tf.multiply(X_tiled, perc)\n",
    "    grad_fn = tfe.gradients_function(get_prob_class, params=[0])\n",
    "    g = grad_fn(X_scaled, idx_class)\n",
    "    g = tf.reduce_mean(g, axis=[1])\n",
    "    g = tf.multiply(X, g)\n",
    "    return g, idx_class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "def visualize_attributions(X, g, idx_class):\n",
    "    \"\"\" Function to plot the original image along with the CNN attributions using\n",
    "        integrated gradients.\n",
    "        \n",
    "        Args:\n",
    "            X: 4D tensor image.\n",
    "            g: integrated gradients.\n",
    "            idx_class: the index of the predicted label.\n",
    "    \"\"\"\n",
    "    img_attributions = X*tf.abs(g)\n",
    "    f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)\n",
    "    ax1.imshow(X[0,:,:,0], cmap='gray')\n",
    "    ax1.set_title('Predicted emotion: %s' %emotion_cat[idx_class], fontsize=15)\n",
    "    ax2.imshow(img_attributions[0,:,:,0], cmap='gray')\n",
    "    ax2.set_title('Integrated gradients', fontsize=15)\n",
    "    plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAEYCAYAAAD4czk4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJztnXuMXtV57p/F2LWNAd/vY7ANBgzB4GCBUxLaEFDaEDVIzTmlaY/4gxZVyZFatWmaHlVHqsofrapejnSkVrRpS6o2gVwaUgItxIFCVUIcc7MJvt+w8RVsMCRcZ50/PD4af+9vMWvmG4/X2M9PQrZf9rf3Wmuvtdd88zz7fVPOWcYYY0xLnHWqG2CMMcZ04s3JGGNMc3hzMsYY0xzenIwxxjSHNydjjDHN4c3JGGNMc3hzMsYY0xzenIwxxjRHV5tTSunnUkobU0pbUkpfHKlGGWOMObNJw80QkVLqkbRJ0k2SdktaI+mXc84/Kn2mp6cnjx8//oQYXZ9iPT09VccV2hpiP/VTP4XHTpgwoeo6P/nJT0Lsvffeq/osUTqO4nQdGh/qNx1HY/Hmm29ie846K/480819oBhdg46TuJ21c6o2RnS2sa+vT319fdzIIZJSctqWBqE56Aw7w+JQznnWYAeN6+IC10jaknPeJkkppa9K+pSk4uY0fvx49fb2nhB75513wnHvvvtuiE2fPj3Eaj/buSFK0gUXXIBtXLJkSdV11q9fH2JHjx6t+izx9ttvY/ytt94KsTfeeCPEJk+eHGK06UydOjXEOu+JJG3YsAHbc+6554ZYbR/HjYvTjTZLugZ9VpJeeOGFEKOx7OvrCzHa2Kgv9FDqHO/XXnsN2zdcOq/ZzQ8A3TxASz8U0Dnphwoa927aOJT21FL7QxM9R0pz/1RtZKXxoR9oTyE7aw7q5td6CyS9OODfu/tjJ5BSuiOl9MOU0g8bGyBjmmHgOjnVbTGmBbrZnGiLDj8a5JzvyjmvzDmvpJ+SjTEnrpNT3RZjWqCbzWm3pIUD/t0r6aXummOMMcZ0pzmtkbQ0pbRY0h5Jt0r6zPt9IKWkSZMmhVgns2fPDrEpU6aEGGkG+/btCzHSoXbv3o1tvPbaa0OMTBKvvvpqiG3evDnESIug9pR+V0z6EvWbNCfSXg4ePFjVntKvYPfv3x9iND7nnHNOiNHv7Onb9M6d8VfSZ599NraHtCi6zssvvxxi1G9qD52PtJSRpEafqNU1utGCStD9oHPW6n+1felWc6rVl+h8NF+GYmSqZbTuYesMe3PKOb+bUvqfkv5dUo+kv8s5Pz9iLTPGGHPG0s03J+WcH5D0wAi1xRhjjJHkDBHGGGMaxJuTMcaY5ujq13pD5ayzztLEiRNPiJGQTy+ekkjeeS6JjRMk7peEw7Vr14bYj3/84xCrfQGY+kLtoc9KLI7Si7Svv/56iJG4TyIqfZYMDRK/pEwvze7YsSPEyMhBbaSxpTZKfG9mzpwZYrX3gcwPZLronHvUjpNNrehea94YiohPGVK6OedI92Uo16m99lCeI2RgqJ3rteYH4nTKWOFvTsYYY5rDm5Mxxpjm8OZkjDGmObw5GWOMaY5RNUTknIMASG+aT5s2LcRqS1QcOXIkxEjcLwnsJORTtnESKMmgQf2bMWNGiM2dOxfbQ9euzaBA7SFTAl2jM5PHcUjUJcPAggUhBzBmaaCMFWReKGV/pv5QNnYai9oM5DRXOoXnk50xYqSzQZwMTkb281N17W6NHDTmI1225XTH35yMMcY0hzcnY4wxzeHNyRhjTHN4czLGGNMco26I6BS7STgkQwQJ2mR+KJXz7mTOnDkYp3Id27dvD7HzzjsvxMhEQJkfSLBfunQptmfPnj0hRmNG/aHjyERCAuzevXuxPfPmzQux6dOnV32eypRQZgUyRFBZDonHkgwMZBQgIZzGjGKd7W6hhMZQjiOGYgzopsRFN+UfSuNM5yTonLWZVIhSaZluxseGiGP4m5Mxxpjm8OZkjDGmObw5GWOMaQ5vTsYYY5rDm5MxxpjmSKPpDDnvvPPyypUrT4hRWiJKSUMpiMhlQ+ejdEHkMJPY/UXXJvcgHUfXoZpBhw8fxvZs2bIlxCgNEKULon7X1o8psX///hDbtWtXiFGKpVdffTXEyO1E94DGrMQrr7wSYjTPyUlZSpPUSeeYvfPOO+rr6+suB08/KaWqRUlOr27cX7SeKFaCrkO1vsgJR9eprf8l8b2k65Rcn53U1voqzReKU6w2zdFpxtqc88rBDvI3J2OMMc3hzckYY0xzeHMyxhjTHN6cjDHGNMeopi8aN26cZs2adUJs06ZN4TgSN6nmEImtlPqIUvvQcRKLlosXLw4xMhtcfPHFIUYmCfosib+StG7duhCrrVn10ksvhdgbb7wRYosWLQoxqg8lcQqiznsqcXonSmlE9ZzoXpPJQWLDCc0LaiOZNmpF+BZE625qAVGaLzIBlAwItE5q67BNnTo1xA4dOhRil156aYi99tpr2B56ZtC9JEMEpdCiVGT02dJ407ymNVHqTyelNEmnM/7mZIwxpjm8ORljjGkOb07GGGOaw5uTMcaY5hhVQ8T48eODOYFEy61bt4YYCYL02SlTpoQYvTW/ZMkSbCOJsJRBgUR3MiWQsYCEVaojJbEgTUI+vb1eW9uKTAUkMEtsniCzAY0P1cUiowPVsCLBXOJ2Lly4sOo4ajeNWU3GiZE2SHTO2draRrVZI2qzQZQyc/T29oZYbXYNyhRCc5DmSynDA2VNoSwuZECorXtGJolS3ScaC7p2bY2nWlPOUOqKtV5Lyt+cjDHGNIc3J2OMMc3hzckYY0xzeHMyxhjTHKNqiDh69Kgef/zxE2Kvv/56OI4MCCT0keBJb3svXbo0xC6//HJs40UXXRRiJMKSqEsCIxk0SBitfVNcYtMGlZk4//zzQ4wyRJCxhLJQSNLkyZNrmqi5c+dWHUciM12DsmpIfB9oThGUqYAMEZTlgGIjyXANF7VZI0iwp3lOc1ribB9vv/12iFEpF7o/b731VoiRmah0byn7ApkIaP5TH2vND6XMDbX3ga5Dc+tUGhVOlXHC35yMMcY0hzcnY4wxzeHNyRhjTHN4czLGGNMco2qI6OvrC4ImCfkkWlLGARLJyUwxc+bMECMzhcRvxJNQTNemz5IoS5kkSgJjbZYHEpRJwK0Vx0vXrc0CQGNBRgeKkamFzAsS95EMHrUGBpo/JMxTG0eSznZ0Y4ioLY9BhobSuM2bNy/EyJRA2UwoWwcZW4aybuk5Qu2htTd//vwQ27FjR4jRc4DK0khsBKEyGic7s8j7XaebOTUa+JuTMcaY5vDmZIwxpjm8ORljjGmOQTenlNLfpZQOpJTWD4hNTyk9nFLa3P8n1zw3xhhjhkGN2v4Pkv6vpC8PiH1R0uqc8x+nlL7Y/+/fG+xEKaUgXC5btiwcR2Lt4cOHQ4zS7JNgun///hAjwVLikhAkttYaCyhWmyZfYpGazkkiM32WjBPUHjJylKC33OnekImADA10bRK3JTZe1I5ZrbmDhPBOw8JQShXU0Hm+WlPDSL/NXzLG0D3atWtXiNXON1pjlA2CjFGSdODAgRA7evRoiJHBg0wNtVlqSiVFyJRDfaQ2kmmDTGKnktHIGjHoN6ec82OSOgvafErS3f1/v1vSLSPaKmOMMWc0w9Wc5uSc90pS/59cKc8YY4wZBif9PaeU0h2S7pDKX4GNOdMZuE6MMcP/5rQ/pTRPkvr/jL/w7SfnfFfOeWXOeeVQdAxjziQGrpNT3RZjWmC435y+Lek2SX/c/+d9NR8666yzgthHpRlIJCRBkN7c7+3tDTESPK+88kpsI4nMJOrSRkufJRGVBHuKSSyi0jlLhopOan9AKImbtSI8XWfatGjqpEwDJMKX+ld7byi2Z8+eEKs1h3T+FqBUOmE4pJTCGNA9p3EiY0yteE3HlTIyUIkXMhEQVJaGSnCQMYD6J0mLFy8OMbpvZKyaPTuqEpTZgkw++/btw/a88kqnTC/NmTMnxGjMqY+1hpgStWaF2rnSRMmMlNJXJD0h6ZKU0u6U0u06tindlFLaLOmm/n8bY4wxI8Kg35xyzr9c+F8fG+G2GGOMMZKcIcIYY0yDeHMyxhjTHKNaMiPnHARsMjrMnTs3xEi0pDf3SaillPhkppD4zW4SekmgrBWEyVJfehOfzkkxEkfpOiS20vlKJSFqxVGKkSGC7uGUKVNCjEwyEpchoLlC/aGsApSVgNrYaRQoGVqGQ845ZK+ovedkAqi953Q+Gg+JhXOK0T3funVrVXsog0fJGEPPEeo3mTGIhQsXVl2jlBmESupQphoqBUNjTllYqD1DcUSPRpaHbvA3J2OMMc3hzckYY0xzeHMyxhjTHN6cjDHGNIc3J2OMMc0xqm69cePGhRQgM2fODMeRY4ScKeQ2ofNRjaaS64dcYZTChdxZ5OqqTTFTgtxA9HkaM3LrUbqfodQ6on6Tw5GuTY4sug+UsqnkQqI4tZ2caLVOyJr0TLXpo2pIKYW5VOuOo3tB87fbGl5UF4lqbk2ePDnEXn311RCjdUt9KdU1otRC5Mgl12bJmdoJpT6idkuclm3WrFkhRmNOx9GzpTallcTjNpS6csP9bDfuP39zMsYY0xzenIwxxjSHNydjjDHN4c3JGGNMc4yqIeKss84KIiWlkCHxj4R4Et1JlDv33HNDrGRKqE3rQqI9Xbu25kqpSnBtPSiCxEgSmYdSX4rEbBJ1SYQnowK1kfpcMmiQME8prOjztYYIamNtqqrh0jlvaudlbd0fuj90DbrfJciAQPWOqK4R1VwjYwDdW0l6+eWXQ4zWOJkfaMxonVxwwQUhtm3bNmwPpSWi61AdK0rfRuNDz8lSmi+6t7U16WpNDSOd+sjfnIwxxjSHNydjjDHN4c3JGGNMc3hzMsYY0xyjaoggSEQlMZ6EbzIl0JvQr7zySoiR6CixGE+x2jf2a9/EL72dTyIq9ZvGjMRf6guNbUkIp8+TMEuQQF1raNi5cyeek2rflGrsdFKbnaTGBDKSGSJyzlVZRGrf0qcYjRGtxQULFuC1ydRA2UduvPHGEHvmmWdC7CMf+UiIPf/88yH24Q9/GNuzadOmEKPMMGSM2bBhA56zE1pjy5cvx2NpLIilS5eGGJkfautDlTJE1D7XiG6edc4QYYwx5rTCm5Mxxpjm8OZkjDGmObw5GWOMaY5RNUSQ0Dtv3rxw3I9+9KMQowwKJOiRQF5bYkJiIZPemiZhtTazAQmrpVIAZDYg80RtaQ1K5U8xMiqUqG0PGR3IrEKCMGUaKF374MGDIbZjx44Qozl1KrJB1EBtrc0UQveCzDI0B0sZB8iA8IEPfCDEHnrooRCjTAv/9m//FmKXXHJJiD344IPYHjJuPPLIIyFWW6Li0KFDIUbPgZJxheZ67T2kjDZDMT8QdGzt/Kk11Iw0p37VGWOMMR14czLGGNMc3pyMMcY0hzcnY4wxzZFGOs35+zFhwoQ8f/78E2I///M/H44jsY0E7VqRkN5SL735fvXVV4cYCZRknCDhnIRRMiCUBH/q4+HDh6vaQwIsGSymTZsWYpMnT8b20FjQsTSvqDwKxbZu3RpiZJyQ2PxAwj6JuiRm0/whEb3zHhw8eFBvv/32iKSJSCnlzvbSvawteVBbtoXuI2WNkKRly5aFGAnsvb29IbZ58+YQo2wdlCGiNC9pndSam6iP3ZTtkXj+09yaMmVKiNHzgeZv7XFSvYFrlMpjrM05rxzsIH9zMsYY0xzenIwxxjSHNydjjDHN4c3JGGNMc4yqIWL8+PF56tSpJzYABLwPfvCDIVZrNjjnnHNCbPr06SG2atUqbCOl5CcRlcRWEtip3MLGjRtDjMoISGwEoOwN1EYyL9D40HEk1EoscF988cUhRqYNyvyxfv36ECNxmzIaSCwKk0hNfaTMACQcv/nmmyHWaeTYt2+f3nrrrREzRHTx2RCrLa1Bx5FRQWIxnUwSzz77bIhddtllIfbcc89VXXv37t3YntpsCbXGGJpDtaVqSu2ZPXt2iO3atSvEOp+REj8HqI00f6X6ki7dlMKgZ3Qhk4QNEcYYY8Ym3pyMMcY0hzcnY4wxzeHNyRhjTHOMasmMlJImTZp0QoxMDST4k1B33nnnhRgZA+bOnRtilI6/dB0S/2pEcknasGFDiG3bti3ESm++k2hPhgEyBpBpo3SdTkoC6owZM0KMhF4SZikLxvbt20OMTBvUl1I7yfxAYjaVg6Brk0DdWZplpMtqdJ6PhOVuTAC140YGGIkNM1SuhtYZmQDItEQmALoXEq97MgyQ+aE0t2quUTIOUdYVWic0L6lkTCkTRSeUNUSqnz+1Bjkai5E21/mbkzHGmObw5mSMMaY5vDkZY4xpDm9OxhhjmmNQRTWltFDSlyXNldQn6a6c8/9JKU2XdI+kRZJ2SPrvOeeYFmAAfX19QYQm4ZCyAUycODHEKNU9mSQuv/zyqs9KbHQgAwKVdaAU/3Q+MhWQMUSS9u7dG2JkNiAxmyBBmAwoZCKRpMWLF4cYjSUZC+g6tW+Vl0Rr+jxdh85JMbpfVF6lJDyPFJ1t66bkBwnVVBKCxpjWnSRt2rQpxEjwpzVBa5TmP2WIoLUosTGBsrPQvCRxv9O4JbGBhp5fEo8PHbtly5YQI9NS7b0ulUeh+UrPkdpz1mac6MYkUfPN6V1Jv5NzXiZplaTPpZQuk/RFSatzzkslre7/tzHGGNM1g25OOee9Oeen+v9+VNILkhZI+pSku/sPu1vSLSerkcYYY84shvSeU0ppkaQVkp6UNCfnvFc6toGllOJ3+mOfuUPSHf1/76atxpy2DFwnxpghbE4ppXMkfUPSb+WcXxvC7xzvknSXJI0bN270UqAbM4YYuE66yUpuzOlClVsvpTRexzamf8o5f7M/vD+lNK///8+TFNMjGGOMMcOgxq2XJH1J0gs55z8f8L++Lek2SX/c/+d9g51r8uTJuuaaa06IkUuHnETk8KHUKpQupTZtiMROwUOHDoUYpWCpTTFCKXsozZEk7dmzJ8QWLVoUYh/96Eer2kNONqrDc8UVV2B7yGlIkDOJXG/kaiJnUslduWPHjhAjdxE5oKiuUG1Nrs40OiPp3kspBdcUOQvpmnTP6TgaDzpuKPWKaK6Si5QcXOSOo5RcpXGme0TH0jiSM5XmAc39kpuR4m+88UaILV++PMQofRG5SInSM6hU56kTWjv0PK518NF409gSNb/Wu07S/5C0LqV0vCLe/9KxTenelNLtknZJ+m9VVzTGGGMGYdDNKef8n5JKAtPHRrY5xhhjjDNEGGOMaRBvTsYYY5pjVOs5TZgwQRdffPGgx1HdHxLySagjYZXMFKW6RiTg0jnnzJkTYmScoHQrV111VYiR+CuxWEuGCKr7RGIk1cP5xV/8xRArjc/Bgwcx3gkJwpdeemmIPfHEE1XXKKVTIqiuENULorGgFDUk/nYaPmprKw0XEuNr20omH+r7UGod0Xy9/vrrQ2zdunUhRuuR0hxdeeWVVeeTeL6RiYDMP5SKjFIn0fomI5Ikffvb3w6xlStXhtiTTz4ZYgsXLgwxqm1VW3tO6i5dFZli6Hz0jCbjWa0hwt+cjDHGNIc3J2OMMc3hzckYY0xzeHMyxhjTHKNqiOjp6Qn1VOjN7pdffjnESMAlQZCEOnpTvCRgkxGAsh2QuE/tPnw4lriqrRkksbhPgiKZCMgQ0ZmhQ2ITCImbEtdPIkgIJSPHvHnzQowE2Pnz5+N1VqxYEWIk1tM56U18uoeUYeRk0zlnyfxA84jmOonclM2B6p7R/JV4TTz99NMhtnTp0hDbuHFjiJFhheZ0yahD40MmGjIo0TOIni00r771rW9heygjw7/8y7+EGBmZXnjhhRAr1WnqpJTzlDJH0BqldtM56flAx5UMNTX4m5Mxxpjm8OZkjDGmObw5GWOMaQ5vTsYYY5pjVA0R7733XhAuS298d0JCKJkaSm9I10KiHl2HTAnURjJokFGBTAmStHPnzhCjN9pJ8CeBm0qKUF9q3+KWWKwlAba2FAqdj8ZMYiGcRHx6u5+EcIIyLHQaD0rtGw5UMoPaQJDIXVvKgAwiQ1lPJKbX3kvKgHD++eeHGBloJGHmGTJe0DojM8bNN98cYmvXrg0xWmOS9J3vfCfEyBxC5gfKBkJjO5Q1WluShJ519Gyh4+he03wslWHpxN+cjDHGNIc3J2OMMc3hzckYY0xzeHMyxhjTHKNqiHjzzTeDSNmZMeL4cZ289tprIUaCIH2WjitliKAMCCQK05v4FKNr0zVKmRfo7f4LL7wwxEjUpePofG+88UaIlQR+6g8JnDQWZ599doiRYEpZMei+SiyaT5kyJcQowwiJ8GSwIDNCZ2wkDRE55/BmPY1nbXkMynBBZRkog8eOHTuwjZ/73OdC7Nlnnw0xmm9UJuLTn/50iK1ZswavTWzatCnEyDxB85dMR48//niI1ZatkKTly5eHGJlyfuM3fiPEqC/r168PsQMHDoQYjbfE5h965tRmoqBxrJ2jtfibkzHGmObw5mSMMaY5vDkZY4xpDm9OxhhjmmPUM0R0vpVcK7CTIYLe9qY0+UMR5WqF7dpz0pvZ9FkS7Eufp0wLJISSQEmCP7Wn1L+hlB/phMwPZIihOVHKkECZKKicA40ZHUfZJTZv3jzodUvC+HDIOYeMACRe0zUpRn0iEwwJ8Z/97GexjatXrw4xEt0fffTRELvppptCjEor0Nwgs4zEGSLIGLNly5YQmzNnTojt3bs3xMhgQXND4mcYlavZvn17iNEzqLZERQmaP2RQovtAa4dMYtTG2mcD4W9OxhhjmsObkzHGmObw5mSMMaY5vDkZY4xpjlE1RFApAErTT5DRgaC3pkn8LQmrtdQK1LUGgpJwWFsWhIRMElbpOGo3GQ0kNjVQjFL8k7BKIjP1md7Ol6SDBw+GGI05ZZigNtL40Fh0ivWlDB/DgdYJmUTovpExhoxDJIZ/8pOfDLFSiQoak4ceeijE/vRP/zTEdu3aFWJkSiCB/eqrr8b27N69O8QoqwKZQ6677roQo+cNlZhYtmwZtodK09CY0/PqscceC7ElS5aE2HPPPRdipTIaZHCi5witCXqO1BodnCHCGGPMaYU3J2OMMc3hzckYY0xzeHMyxhjTHKNqiBg3bpxmzZp1QowyFlA2CBIEKasCZRIgka8kHJJwTsIhmQAIEudJyC4Jh0PJ3lADjcVQICG0dsyo33RfZ8yYEWL79u3D9pC4TveGRF2aKy+//HKIUbs75w/1d7hQhgga99q5QWYSMqc88MADITZ//nxs41NPPRVit912W4hRJgkyj9xzzz0hdv3114cYlbKQpD179oQY9ZsySdCY/fM//3OI0T2m80lsvCATFsXImEJlPSijB2WmkNgoc95554VY7TwmkxmZZLp53vibkzHGmObw5mSMMaY5vDkZY4xpDm9OxhhjmsObkzHGmOYY9XpOnTVfqF7RokWLQoycIOQ2oRQhBLnojrexE0ppQ5Crq9YpWKrNQi4zipHLhvpCTkhyrZXGkWrkEOQGq63ZQ/d///79eB1KKUN9JIcYnZPGgvoyefLkQc8/XFJKwV1F97zWCTpz5swQoz6R02vt2rXYRnLSrVmzJsTIyXno0KEQo3tG6ZBKLtuFCxeGGKU/WrduXYjNnj07xK644ooQ27hxY1VM4ufa9OnTQ4zm/9e+9rUQI3dc7ZqXeCzI4Ujzgu4hQWug9jmA56s6yhhjjBlFvDkZY4xpDm9OxhhjmmPQzSmlNDGl9IOU0rMppedTSn/YH1+cUnoypbQ5pXRPSqkuZYIxxhgzCDWGiLck3ZBzfj2lNF7Sf6aUHpT025L+Iuf81ZTSX0u6XdJfvd+Jxo8fH+q2XHrppeE4EuA6jRQSi45UF4aOK6XVqDVU1IqEJFBSep2SoE5xOie1h0RUSulCZhMyBpSuQ6l1SAglKC0L9bkz7dVxSOilGk9U04hSZ5GhgOZP53ElQ8tIQW0gEwH1k+ZBrVnmE5/4BLaH7hvVJiLxm+YgGW1oHpTWLRkTqBYV1YPaunUrnrMTGjMyTkjS9u3bQ4zGYvHixSG2ZcuWqvYQnUad49Qafch4Q3OP1l2tUauWQb855WMcTwA1vv+/LOkGSV/vj98t6ZZht8IYY4wZQJXmlFLqSSk9I+mApIclbZV0JOd83Ne5W9KCwmfvSCn9MKX0w1oLoTFnGgPXyaluizEtULU55ZzfyzlfJalX0jWSqDYxfn/LOd+Vc16Zc15Z+6seY840Bq6TU90WY1pgSG69nPMRSY9KWiVpakrpuNjQK+mlkW2aMcaYM5VBDREppVmS3sk5H0kpTZJ0o6Q/kfSIpE9L+qqk2yTdN9i5+vr6ikL7QKj2SO0b+CRM05vvJOhJ9UJ+bS0dilF7SnVYaiGjAtVAohpYF154YYiVMjL867/+a4jt2LEjxC666KIQI7MJZSCgGjclYZV+VUyfp/tAc4XMKhTrHNtu62QNhOo5kShN2QVoPGjcaTxoTXzrW9/CNtL9/djHPhZiVPdp+fLlIUZ1tHp7e0PsmWeewfZQFgzK/EAmCcoaQc+bFStWhFjJCEP1nAi6DzQ+1Eai9Bwh01Jt9hnqY8l40UnpOVtDjVtvnqS7U0o9OvZN696c8/0ppR9J+mpK6U5JT0v60rBbYYwxxgxg0M0p5/ycpPAjQ855m47pT8YYY8yI4gwRxhhjmsObkzHGmOZI3bzBO1TGjx+fp02bdkLs4x//eDiO0t/T2+tUMmDJkiUhtmBBfAWL0tdLLDyTIE4CI4moJFCTeaHGKPJ+UAYNKilCY0EGlNK82LBhQ4h95zvfCTEySVB7KKtAyYxBkIBLpg+6hwRly6Dzbdq06YR/b926VT/5yU9GJE1ESikMPs0tukckXtNnKZPEUIwoneu4dCzNdRpjgtYEzVWJM8NQfyhbBq3lVatWhRhlkihlc5g7d26IUeYSKgFCc7qb0hMS3xsaSzpnbZYaenbS/c85r615ZcLfnIwxxjSHNydjjDHN4c3JGGNMc3hzMsYY0xw1L+GOGO+++25Il797R5NLAAARx0lEQVR69epw3Ac/+MEQI/GOBHYyTpA4SaKjVJ/lgag1ThBDyTtIQjG9TU9lJqgvlN2AhNrSOX/pl34pxJ577rkQ+6//+q8Qo8wAJKKWhHAyAJTubSckzNN16HydBpTaOTJcqA00t+i+kaBNZgG6RslIQuI3jQGtPbrn8+fPDzHKslBaT3v27Amxa66Jr2HSORctWhRijz32WIh95CMfCTEq9SFxH+lYmm8vvvhiiNGaIENYae7TOqH7RWui9CyovfZw8TcnY4wxzeHNyRhjTHN4czLGGNMc3pyMMcY0x6gaInp6ekKa/yNHjoTjHnnkkRCjtP+UDYJS55PgXxKwa0tckJBJ1yGRsFaIl/jNbjJPUAp7SldP/aNrlFLv07FUumHx4sUhRn1cunRpiH3jG9/AaxMkkNN1qI0k6lP/6K35TjG6VDrhZNKNUF2bSYLWmBQzZEjSZZddVnUcmR/IQEPlLcgsIHG5DiozQWuUTFTE/fffH2Kl+04mC8qqsXfv3hCjOU3GlKFklSHzRO38ofVUa6zqBn9zMsYY0xzenIwxxjSHNydjjDHN4c3JGGNMc4yqIaKvry+IyyT0kYBLxgl6C5vETYqRGC6xcEjUGgtIZK6NSXVifKk9JFBSyQDKFkBlIkrHUtkLMmPQfSWjwuzZs0NsKOUByDBC16ExIzGaypF0ivWHDh2qbt9oQ+NOY0xrgkR8SfqZn/mZEKOxO//880OM1sktt9wSYvRs+Omf/mlsD5Voufnmm0NszZo1IXb99deH2NNPPx1ilJGGDA2SdPXVV4fYww8/HGJUHui73/1uiNF6pLVcguY6mTnI/EDGi9rsFLWlXgh/czLGGNMc3pyMMcY0hzcnY4wxzeHNyRhjTHOMqiEi5xwyD5AoV/uGNH2WUssfPXo0xEjclFgUJlGPzAbURhIiaw0N7xfvhEwfVB7gySefDDHKBlFKf79r164Q279/f4iRsEqi7vbt20OMxqdkYCHjBX2+1uhC95VineUPas8/ktD8rxWbDx48GGJkGillQOgsfSNJy5YtCzHK/EBGhfvuuy/Efv3Xfz3EPv/5z2N7Pv7xj4fY17/+9RC7/fbbQ+zOO+8MMXoG0dxfvnw5tufee++tOicZjOjZRIabodz/2nlBz89uTA3dZE7xNydjjDHN4c3JGGNMc3hzMsYY0xzenIwxxjSHNydjjDHNkWpdFyPBxIkTc2edE6ptRClBKIXGnDlzQmzVqlUhtmLFihDrdFsdh+oinXvuuVWfJ4cauVWGUluF3DO1x5HDZ/PmzVXno3RRErt0alMa0T2k1ECUqqiUTonGl2p60X0lFx6lxCLnYqcz84knntCrr746IkWdUkq5xuXUzdql+mg0xpdccgl+nlyStB7p81Tri/pC64QcqBKn8rnoootCjFyGNFe///3vh9jcuXNDbN++fdgemlv0XKO5Tu5imoP0WXqelqAxJ0chOYapPaUacHC+tTnnlYMd529OxhhjmsObkzHGmObw5mSMMaY5vDkZY4xpjlFNXzRjxgz96q/+6gmxxx9/PBy3c+fOECOhj0Q5EmpLqW8IElbpOrXpaug4Eh1LkGhJMRK4L7zwwhBbuTLqkLWmFInFYzJEUIxE4pdeeinEKMVSyRBBKaNofClG95raWLr2QLpJ09JJT09PMOGQSF6b2qo2/QytHTKxSNKzzz4bYrfeemuIPfbYYyFGxom///u/D7E/+qM/CrGvfOUr2B469s/+7M9C7Hd/93dD7A/+4A9C7Hvf+16IfeELXwixUjqlz3zmMyH22c9+NsS+/OUvh9gNN9wQYqtXrw4xmr90DyVe42SooPVU+0ws1aQbLv7mZIwxpjm8ORljjGkOb07GGGOaw5uTMcaY5hjVDBHTp0/PN9100wmxbdu2hePoLXASqkmUu+KKK0Lsox/9aIjNmjUL20iZGkh4powDlJmARMLaGk9S/VvX1B4SQck4QceVhPA9e/aEGGVVoBjdQ3pjnwwxlKVDqh9LujaZO2h8au7h448/riNHjoyIK6Knpyd31laieVCbPYTMGlQzqLaOmiRNmDAhxChDCmUAodpjVEtq2rRpVW2U2OBB16H5QoYXuudUz6lkhKH5SsdSe6jWFs1fovQcoWvT85OeI2RuqjWE0Ti+/fbbzhBhjDFmbOLNyRhjTHN4czLGGNMc1ZtTSqknpfR0Sun+/n8vTik9mVLanFK6J6XEv5w2xhhjhshQMkT8pqQXJB1XUv9E0l/knL+aUvprSbdL+qv3O8Gbb76pTZs2nRAjYZXMCpTlgcR5gsR9uq7EwiwJq1SOgt64JmGUhOMSJHp3kzWChHUSRkvZByijw0MPPRRiZCwhEZ7EVroHJQG2ViiuLYVB84LuwUhmhOikr68vzDkSlsmsQPeX5gYZFagMTGncaTzJrEBrb8GCBSFGJoBLL700xCjjhCR96EMfCrHnn38+xG688cYQo2wQV111VYhR/z71qU9he+69994Qo7lFhiB6ZtB6oudIKUMEXZvWOH2e5g/Nf2pjN4a7qm9OKaVeSTdL+tv+fydJN0j6ev8hd0u6ZditMMYYYwZQ+83pLyV9QdLxLX2GpCM55+Nb5W5J8cchSSmlOyTdIQ2tEJYxZxID14kxpuKbU0rpk5IO5JzXDgzDofj9Led8V855Zc555VASnhpzJjFwnZzqthjTAjW7xXWSfiGl9AlJE3VMc/pLSVNTSuP6vz31SopihDHGGDMMBt2ccs6/L+n3JSml9LOSPp9z/pWU0tckfVrSVyXdJum+wc7V09ODYncnJKKSMLt06dJBzyXVi3xSvYGBPk+iLgnPs2fPDjESo0vXISGfRHsSx0m0pPEmw4ckbdmyJcSovAa1kVLvk6hPMTqfxCI1lZeg+0AZCEjorY2NJDXnJzMIGSfoXHQczSEaS0maN29eiNXOVcoAQtlVnnnmmRBbsmQJtmft2rUhdv7554fYf/zHf4QYPUfWrVsXYrRGv/nNb2J76N7Q/K8t5ULPILpfpecIzX/KBkHPSpor9DymZwsdV13qpeoo5vck/XZKaYuOaVBf6uJcxhhjzP9nSCJQzvlRSY/2/32bpGtGvknGGGPOdJwhwhhjTHN4czLGGNMco+rt7unpCenpSZSjTAuUXWDu3LkhRlkj6HwlgZ2ER8pOQaI9iZsvvvhiiG3dujXESkYRujZlfhiKiaATEihpzCQ2jFCZEno7vzbTAomypYweBL11T9eh9+5qMyx0Cr0jbZDoPB/NLbpvdM9pDtWK8ySGS9K+fftCrNboQ9emjBNUyoJMR6Vjae1deOGFIVZbooUyxdBzSeI+0jnJcEJjTmuC5hxlXJHYmFAqi9MJzf/aUj7drAt/czLGGNMc3pyMMcY0hzcnY4wxzeHNyRhjTHOMqiFi0qRJ+sAHPnBC7MorrwzHkTBLotzGjRtDjERZEolLef7IWECQaNnb21v12QMHDoTYkSNH8FgSgMkQQcJzbbYL+uz06dOxPfQWOL19TmURyKxC/SMxmYwzEr+JT6IwfZ7Gkfo32qSUqudhJzQHab6RAYfE61JGBmL+/PkhRveSSmE89dRTIUbrtlQihQR/mtc0Ny666KIQo+cDZbHYvn07tmfFihUhRnOd2k3npPlAfSkZNGgOkMmIxpfWDhk5yGBUW9KG8DcnY4wxzeHNyRhjTHN4czLGGNMc3pyMMcY0x6gbIjoNEJdffnk4jt58pxIO9FY4CXAkRJbecCZRmERLipEgSKUF6Dg6n8T9JvPE4cOHQ4wEz1mzZoUYmR/ILCDxvdm/f39VG8mMQWIrmV9KmQpofEjspxidk+4NCfOdxolSCZbh0nm+2lIYVL6E5kFtJgzK9CFJ1157bYjRONEaffDBB0Ps9ttvD7EHHnggxKgMRqmdCxcuDDEaHzLBkJGD5lqptAxlvCAo8wOtMWoj3VcyPgzlnLRGyXhBhhGaU84QYYwx5rTCm5Mxxpjm8OZkjDGmObw5GWOMaQ5vTsYYY5pjVN16kydP1tVXX31CjNxj5A6h2IwZM0KMaq4MpV4RuUtKqY46IbcSud4oDUopzUc3NVfIcbR+/foQo/6V6ksRlMqEaiqRO4jGjFK1kBuxdG1qe63jkmpOkVPuZNZzyjmHsaLaZS+99FKIUcoqmus0B8lhRteV2IW3fPnyEPvHf/zHELv11ltDjOblr/3ar4XYnXfeie2hNGgbNmyoOo5SJ1G/aS3S80uqc3hKfG/oOBpvetaV0l7RM5CcstRHmtu0JmpdobX4m5Mxxpjm8OZkjDGmObw5GWOMaQ5vTsYYY5pjVA0R48ePD0IjCbhkfqC0MvRZMiCQoFdKO0LGAopRe0jIrE1VRLVnJK6VROImGSpqjQFkXijVqSHIUEFtrIXaQ+YOie93bf0uujckUFNfOmMjmb7o7LPPDnXPSBCvFbSpjlatYaUksC9dujTEKDUQHUcpy6gO1Zo1a0KslOaL0oTRc4TmxrRp06raSPXj6HwSGwHoOjTfqC+U5ojuDZkkJK7zVGuSoLVH94HWAD17a9eKvzkZY4xpDm9OxhhjmsObkzHGmObw5mSMMaY5RtUQIUUhjURLqilCIhplByCTRK3JoRSvFYpJYCdKtYkIEvxJRC0JoZ1Qu0mApewbEo8FjRm1h4TV2gwYpYwVJEhTjD5fK+DSfe0U+n/wgx9g+4bDj3/842AGoEwENJ5k/KD1RJkwiG3btmH8b/7mb0LsuuuuC7Hvf//71efsZMWKFSFWWmPf/e53Q4zuZW0GDao5NWnSpBArGSJozHfu3Fl1baqFRv2m+VsyItF16DlUmw2HzkcmCbpGaczCZ6uOMsYYY0YRb07GGGOaw5uTMcaY5vDmZIwxpjnSSL7ZPujFUjooKaqC3TNTEqd8GJucTv05U/pyQc6Z6ycMkZO4TqQz536MNU6nvkgjsFZGdXM6WaSUfphzXnmq2zFSnE79cV/a4nTow3Hcl3YZif7413rGGGOaw5uTMcaY5jhdNqe7TnUDRpjTqT/uS1ucDn04jvvSLl3357TQnIwxxpxenC7fnIwxxpxGeHMyxhjTHGNuc0op/V1K6UBKaf2A2PSU0sMppc39f8aSkw2SUlqYUnokpfRCSun5lNJv9sfHXH9SShNTSj9IKT3b35c/7I8vTik92d+Xe1JKXFq1QVJKPSmlp1NK9/f/e0z1xWulTbxW6hhzm5Okf5D0cx2xL0panXNeKml1/7/HAu9K+p2c8zJJqyR9LqV0mcZmf96SdEPO+UpJV0n6uZTSKkl/Iukv+vtyWNLtp7CNQ+U3Jb0w4N9jrS//IK+VFvFaqSHnPOb+k7RI0voB/94oaV7/3+dJ2niq2zjMft0n6aax3h9JZ0t6StK1OvaW+Lj++Ick/fupbl9lH3p17GF3g6T7JaWx2Bevlbb/81op/zcWvzkRc3LOeyWp/8/Zp7g9QyaltEjSCklPaoz2p/+r/TOSDkh6WNJWSUdyzseLQO2WtOBUtW+I/KWkL0g6XnxmhsZuXwYyJufWQLxWmuOkrJXTZXMa06SUzpH0DUm/lXOuqxrYIDnn93LOV+nYT1LXSFpGh41uq4ZOSumTkg7knNcODMOhzffldMNrpS1O5loZ9Uq4J4n9KaV5Oee9KaV5OvbTyJggpTRexxbbP+Wcv9kfHrP9kaSc85GU0qM6pg1MTSmN6/8pqlfSS6e0cXVcJ+kXUkqfkDRR0nk69tPhWOxLJ2N2bnmtNMlJWyunyzenb0u6rf/vt+nY76ObJx2rI/0lSS/knP98wP8ac/1JKc1KKU3t//skSTfqmED6iKRP9x82JvqSc/79nHNvznmRpFslfS/n/Csag30BxtzckrxWWuWkrpVTLaYNQ3z7iqS9kt7Rsd9l3q5jv+NcLWlz/5/TT3U7K/vyYR37uvucpGf6//vEWOyPpOWSnu7vy3pJ/7s/vkTSDyRtkfQ1SRNOdVuH2K+flXT/WOyL10qb/3mt1P3n9EXGGGOa43T5tZ4xxpjTCG9OxhhjmsObkzHGmObw5mSMMaY5vDkZY4xpDm9OxhhjmsObkzHGmOb4fxgW2jFg/HcNAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f90298b5b38>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.device(device):\n",
    "    idx_img = 1000 # modify here to change the image\n",
    "    X = tf.constant(X_train[idx_img,:].reshape(1,48,48,1))\n",
    "    g, idx_class = integrated_gradients(X, m=200)\n",
    "    visualize_attributions(X, g, idx_class)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**The brighter parts of the integrated gradients image have the most influence on the predicted label.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Webcam  testing\n",
    "----\n",
    "\n",
    "Finally, you can test the performance of your CNN on any new set of images or videos. In the cell bellow, I show you how you can use your webcam to capture image frames and make predictions on them.\n",
    "\n",
    "To be able to do this you would have to install the library **opencv-python**. You can easily do this by typing in the terminal:\n",
    "\n",
    "> **pip install opencv-python**\n",
    "\n",
    "As you have seen in the beginning of the notebook, the images in the FER2013 dataset have already the faces cropped. In order to crop the faces in the new images/videos, we will be using the pre-trained Haar-Cascade algorithm, found in the **OpenCV** library.\n",
    "\n",
    "So, let's get started!\n",
    "\n",
    "If you want to run the model on live webcam footage use:\n",
    "> **cap = cv2.VideoCapture(0)**\n",
    "\n",
    "If you have a pre-recorded video you would like to test, you can use:\n",
    "> **cap = cv2.VideoCapture(path_video)**\n",
    "\n",
    "Feel free to try the network on yourself! I guarantee that it's going to be a lot of fun :)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import OpenCV\n",
    "import cv2\n",
    "\n",
    "# Create font for adding text to images\n",
    "font = cv2.FONT_HERSHEY_SIMPLEX"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import pre-trained Haar-Cascade algorithm for face detection\n",
    "face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + \"haarcascade_frontalface_default.xml\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The code for webcam capture has been inspired from [this tutorial](https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Open video capture\n",
    "cap = cv2.VideoCapture(0)\n",
    "\n",
    "# Uncomment if you want to save the video along with its predictions\n",
    "# fourcc = cv2.VideoWriter_fourcc(*'mp4v') \n",
    "# out = cv2.VideoWriter('test_cnn.mp4', fourcc, 20.0, (720,480))\n",
    "\n",
    "while(True):\n",
    "    # Capture frame-by-frame\n",
    "    ret, frame = cap.read()\n",
    "   \n",
    "    # Transfrom RGB frame to gray scale\n",
    "    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n",
    "    \n",
    "    # Detect all the faces in the frame\n",
    "    faces = face_cascade.detectMultiScale(gray, 1.3, 5)\n",
    "    \n",
    "    # Iterate through each face found\n",
    "    for (x,y,w,h) in faces:\n",
    "        # Crop the face from the grayscale frame\n",
    "        face_gray = gray[y:y+h, x:x+w]    \n",
    "        # Resize images to 48x48 pixels\n",
    "        face_res = cv2.resize(face_gray, (48,48)) \n",
    "        face_res = face_res.reshape(1,48,48,1)\n",
    "        # Normalize image by max\n",
    "        face_norm = face_res/255.0\n",
    "        # Forward-pass through the model\n",
    "        with tf.device(device):\n",
    "            X = tf.constant(face_norm)\n",
    "            X = tf.cast(X, tf.float32)\n",
    "            logits = model.predict(X, False)\n",
    "            probs = tf.nn.softmax(logits)\n",
    "            ordered_classes = np.argsort(probs[0])[::-1]\n",
    "            ordered_probs = np.sort(probs[0])[::-1]\n",
    "            k = 0\n",
    "            # Draw the probabilities for each prediction, on the frame\n",
    "            for cl, prob in zip(ordered_classes, ordered_probs):\n",
    "                # Add rectangle with width proportional to its probability\n",
    "                cv2.rectangle(frame, (20,100+k),(20+int(prob*100),130+k),(170,145,82),-1)\n",
    "                # Add the emotion label to the rectangle drawn\n",
    "                cv2.putText(frame,emotion_cat[cl],(20,120+k),font,1,(0,0,0),1,cv2.LINE_AA)\n",
    "                k += 40\n",
    "    \n",
    "    # Uncomment if you wish to write this video to disk\n",
    "    #out.write(frame)\n",
    "    \n",
    "    # Display the resulting frame\n",
    "    cv2.imshow('frame',frame)\n",
    "    if cv2.waitKey(1) & 0xFF == ord('q'):\n",
    "        break\n",
    "   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# When everything is done, release the capture\n",
    "cap.release()\n",
    "cv2.destroyAllWindows()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
